﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Consultorio_Medico
{
    public partial class AsignacionPermisos : Form
    {
        public AsignacionPermisos()
        {
            InitializeComponent();
        }

        private void AsignacionPermisos_Load(object sender, EventArgs e)
        {
            this.rdCompleto.Checked = true;
            this.gbIndividual.Visible = false;
            cargarUsuarios();
            cargarPerfiles();
            cargarPermisos();

        }

        private void cargarUsuarios()
        {
            cmbUsuarios.Text = "Seleccione un usuario...";

            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            try
            {
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT usuario FROM usuarios";
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    cmbUsuarios.Items.Add(lector["usuario"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                conexion.Close();
                conexion.Dispose();
            }
        }

        private void cargarPerfiles()
        {
            cmbPerfiles.Text = "Seleccione un perfil...";
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            try
            {
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT tipo_permiso FROM permisos GROUP BY tipo_permiso";
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    cmbPerfiles.Items.Add(lector["tipo_permiso"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                conexion.Close();
                conexion.Dispose();
            }
        
        
        }

        private void rdCompleto_CheckedChanged(object sender, EventArgs e)
        {
            if (rdCompleto.Checked)
            {
                gbCompleto.Visible = true;
                gbIndividual.Visible = false;
            }
            else
            {
                gbCompleto.Visible = false;
            }
        }

        private void rdIndividual_CheckedChanged(object sender, EventArgs e)
        {
            if (rdIndividual.Checked)
            {
                gbCompleto.Visible = false;
                gbIndividual.Visible = true;
            }
            else
            {
                gbIndividual.Visible = false;
            }
        }

        private void cargarPermisos()
        {
            MySqlConnection conexion = null;
            MySqlDataAdapter lector = null;
            try
            {
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT id, desc_permiso, item_menu, tipo_permiso, fecha_alta FROM permisos";
                lector = new MySqlDataAdapter(consulta);
                DataSet ds = new DataSet();
                conexion.Open();
                lector.Fill(ds);
                dgvPermisos.DataSource = ds.Tables[0];
                dgvPermisos.Columns[0].HeaderText = "Número";
                dgvPermisos.Columns[1].HeaderText = "Descripción";
                dgvPermisos.Columns[2].HeaderText = "Item del Menú";
                dgvPermisos.Columns[3].HeaderText = "Tipo de Permiso";
                dgvPermisos.Columns[4].HeaderText = "Fecha de Alta";

                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                conexion.Close();
                conexion.Dispose();
            }
        
        }

        private void btnAsignar_Click(object sender, EventArgs e)
        {
            
            if (asignar())
            {
                MessageBox.Show("Permisos asignados!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                this.Close();
                this.Dispose();
            }
            else
            {
                MessageBox.Show("Permisos no asignados!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private Boolean asignar()
        {
            //asignacion de permisos
            Boolean correcto = false;
            MySqlConnection conexion = null;
            String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
            try {

            int idUsuario = obtenerIdUsuario(cmbUsuarios.Text);
            if (idUsuario == 0)
            {
                MessageBox.Show("Seleccione un Usuario Correcto!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (rdCompleto.Checked)
                {
                    if (cmbPerfiles.Text.Trim().Equals(""))
                    {
                        MessageBox.Show("Seleccione un Perfil Correcto!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                    //elimina los permisos cargados que no correspondan al nuevo perfil
                    List<int> permisosAEliminar = obtenerPermisosPorTipo(cmbPerfiles.Text.Trim());
                    foreach (int permiso in permisosAEliminar)
                    {
                        conexion = new MySqlConnection(cadenaConexion);
                        MySqlCommand eliminar = conexion.CreateCommand();
                        eliminar.CommandText = "DELETE FROM usuarios_permisos WHERE id_usuario = @id_usuario AND id_permiso <> @id_permiso";
                        conexion.Open();
                        eliminar.Parameters.AddWithValue("@id_usuario", idUsuario);
                        eliminar.Parameters.AddWithValue("@id_permiso", permiso);
                        eliminar.ExecuteNonQuery();
                        conexion.Close();
                        conexion.Dispose();
                    }
                    //cargar perfil completo
                        List<int> permisos = obtenerPermisosPorTipo(cmbPerfiles.Text.Trim());
                        //cargar todos los permisos del perfil
                        foreach (int permiso in permisos)
                        {
                            conexion = new MySqlConnection(cadenaConexion);
                            MySqlCommand insertar = conexion.CreateCommand();
                            if (!verificarPermisosUsuario(permiso))
                            {
                                insertar.CommandText = "INSERT INTO usuarios_permisos(id_usuario, id_permiso) VALUES(@id_usuario, @id_permiso)";
                                conexion.Open();
                                insertar.Parameters.AddWithValue("@id_usuario", idUsuario);
                                insertar.Parameters.AddWithValue("@id_permiso", permiso);
                                insertar.ExecuteNonQuery();
                                conexion.Close();
                                conexion.Dispose();
                            }   
                        }
                        correcto = true;

                    }
                }
                else if (rdIndividual.Checked)
                {
                    //carga los permisos individualmente
                    if (dgvPermisos.SelectedRows.Count == 0)
                    {
                        MessageBox.Show("Seleccione un Permiso!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        int id_usuario = obtenerIdUsuario(cmbUsuarios.Text);
                        List<int> permisos = obtenerPermisosPorUsuarios(cmbUsuarios.Text);
                        if (permisos.Count != dgvPermisos.SelectedRows.Count)
                        {
                            Boolean check = false;
                            //elimina los permisos deseleccionados
                            foreach (int permiso in permisos)
                            {
                                for (int i = 0; i < dgvPermisos.SelectedRows.Count; i++)
                                {

                                    if (permiso == Convert.ToInt16(dgvPermisos.SelectedRows[i].Cells[0].Value))
                                    {
                                        check = true;
                                        break;
                                    }
                                    else
                                    {
                                        check = false;
                                    }

                                }

                                if (!check)
                                {
                                    conexion = new MySqlConnection(cadenaConexion);
                                    MySqlCommand eliminar = conexion.CreateCommand();
                                    eliminar.CommandText = "DELETE FROM usuarios_permisos WHERE id_usuario = @id_usuario AND id_permiso = @id_permiso";
                                    conexion.Open();
                                    eliminar.Parameters.AddWithValue("@id_usuario", id_usuario);
                                    eliminar.Parameters.AddWithValue("@id_permiso", permiso);
                                    eliminar.ExecuteNonQuery();
                                    conexion.Close();
                                    conexion.Dispose();
                                }
                            }
                        }             
                        foreach (DataGridViewRow row in dgvPermisos.SelectedRows)
                        {
                            int permiso = Convert.ToInt16(row.Cells[0].Value);
                            //carga los permisos seleccionados
                            if (!verificarPermisosUsuario(permiso))
                            {
                                conexion = new MySqlConnection(cadenaConexion);
                                MySqlCommand insertar = conexion.CreateCommand();
                                insertar.CommandText = "INSERT INTO usuarios_permisos(id_usuario, id_permiso) VALUES(@id_usuario, @id_permiso)";
                                conexion.Open();
                                insertar.Parameters.AddWithValue("@id_usuario", idUsuario);
                                insertar.Parameters.AddWithValue("@id_permiso", permiso);
                                insertar.ExecuteNonQuery();
                                conexion.Close();
                                conexion.Dispose();    
                            }
                        }
                        correcto = true;
                    }    
                  }
               }
            
            }
            catch (Exception)
            {
                        correcto = false;
                        conexion.Close();
                        conexion.Dispose();
            }
            return correcto;
        }

        private int obtenerIdUsuario(String usuario)
        {
            //obtiene el id de un usuario
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            int idUsuario = 0;
            try
            {
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT id FROM usuarios WHERE usuario = @usuario";
                consulta.Parameters.AddWithValue("@usuario", usuario);
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    idUsuario = Convert.ToInt16(lector["id"].ToString());
                }

                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                idUsuario = 0;
                conexion.Close();
                conexion.Dispose();
            }

            return idUsuario;
        
        }

        private List<int> obtenerPermisosPorTipo(String tipo)
        {
            //obtiene todos los permisos segun el tipo de permiso
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            List<int> permisos = null;
            try
            {
                permisos = new List<int>();
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM permisos WHERE tipo_permiso = @tipo_permiso";
                consulta.Parameters.AddWithValue("@tipo_permiso", tipo);
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    permisos.Add(Convert.ToInt16(lector["id"].ToString()));
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                permisos = null;
                conexion.Close();
                conexion.Dispose();
            }

            return permisos;

        }

        private void cmbUsuarios_SelectedValueChanged(object sender, EventArgs e)
        {
            //carga los permisos asignados segun el usuario elegido
            dgvPermisos.ClearSelection();
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            try
            {
                
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                int id_usuario = obtenerIdUsuario(cmbUsuarios.Text);
                consulta.CommandText = "SELECT * FROM usuarios_permisos WHERE id_usuario = @id_usuario";
                consulta.Parameters.AddWithValue("@id_usuario", id_usuario);
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    for (int i = 0; i < dgvPermisos.RowCount; i++)
                    {
                        if (dgvPermisos.Rows[i].Cells[0].Value.ToString() == lector["id_permiso"].ToString())
                        {
                            dgvPermisos.Rows[i].Selected = true;
                        }
                    }
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                conexion.Close();
                conexion.Dispose();
            }
        }

        private Boolean verificarPermisosUsuario(int id_permiso)
        {
            //verifica si ya se encuentra cargado ese permiso en un usuario
            Boolean existe = false;
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            try
            {

                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                int id_usuario = obtenerIdUsuario(cmbUsuarios.Text);
                consulta.CommandText = "SELECT * FROM usuarios_permisos WHERE id_permiso = @id_permiso AND id_usuario = @id_usuario";
                consulta.Parameters.AddWithValue("@id_permiso", id_permiso);
                consulta.Parameters.AddWithValue("@id_usuario", id_usuario);
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    if (lector["id_usuario"].ToString() != "")
                    {
                        existe = true;
                        break;
                    }
                }
                
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                existe = false;
                conexion.Close();
                conexion.Dispose();
            }
            return existe;
        
        }

        private List<int> obtenerPermisosPorUsuarios(String usuario)
        {
            //obtiene los permisos asignados a un usuario
            MySqlConnection conexion = null;
            MySqlDataReader lector = null;
            List<int> permisos = null;
            try
            {
                permisos = new List<int>();
                String cadenaConexion = "Server=Localhost;Database=consultorio;Uid=root;Pwd=123;";
                conexion = new MySqlConnection(cadenaConexion);
                MySqlCommand consulta = conexion.CreateCommand();
                int id_usuario = obtenerIdUsuario(usuario);
                consulta.CommandText = "SELECT * FROM usuarios_permisos WHERE id_usuario = @id_usuario";
                consulta.Parameters.AddWithValue("@id_usuario", id_usuario);
                conexion.Open();
                lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    permisos.Add(Convert.ToInt16(lector["id_permiso"].ToString()));
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception)
            {
                permisos = null;
                conexion.Close();
                conexion.Dispose();
            }

            return permisos;
        
        }

    }
}
